package com.toutiao.score

import scala.io.Source

import scala.collection.mutable.{HashMap => HMap}
import scala.collection.mutable.ArrayBuffer
import net.liftweb.json.{JsonAST,Extraction,Printer,parse}

import scala.math.{log,min,max}

import org.apache.log4j.Logger

object ExpMeasure {
  
  implicit val FORMATS = net.liftweb.json.DefaultFormats
  
  def get(location:String) = {
//    val source = Source.fromFile(location,"UTF-8")
//    val lineIterator = source.getLines
//    val xs = lineIterator.map(line => {
//      val vs = line.trim.split(" ")
//      val v = vs(0)
//      val g = vs(1).toInt
//      (v,g)
//    }).toMap
//    
//    xs
//  }
    val source = Source.fromFile(location,"UTF-8")
    val lineIterator = source.getLines
    val ms = new ArrayBuffer[(String,Int)]
    for (line <- lineIterator) {
    	  val x= parse(line)
    	  val x0 = x.children(0).extract[String]
    	  val x1 = x.children(1).extract[Int]
    	  ms += ((x0,x1))
     }
    source.close
    ms.toMap
  }  
  
  def getTitleMeasure(location:String) = {
    val source = Source.fromFile(location,"UTF-8")
    val lineIterator = source.getLines
    val xs = lineIterator.map(line => {
      val vs = line.trim.split(" ")
      val v = vs(0)
      val g = vs(1).toInt
      (v,g)
    }).toMap
    
    xs    
  }
  
}

//// 要实现六个TermScore方案
//
//class ExpKeyScorer(
//				val M:Map[String,Int], val N:Int,
//				val T:Map[String,Int] //,val W:Map[String,Int]
//				) {
//  
//  private val AVGDL = 500
//  private val K1 = 1.7
//  private val B = 0.75
//  
//  val MIN_CC = 5
//  
//  val _log = Logger.getLogger(this.getClass.getName)
//  
//  def getTitleScore(vs:Array[String]) = {
//    val vm = new HMap[String,Int]
//    for (v <- vs){
//      val c = vm.getOrElse(v, 0)
//      vm(v) = c+1
//    }
//    val s = vm.map(v => {
//      val ss =
//        if (v._1.size == 1){
//          1.1
//        }
//        else if (T.contains(v._1)){
//          v._2*log(N/T(v._1))
//        }
//        else {
//          v._2*log(N/100)
//        }
//      (v._1,ss)
//    })
//    s.toMap
//  }
//  
//  // TFIDF
//  def getTFIDFScore(cutTitle:String,cutContent:String) = {
//    val vs = (cutTitle+" "+cutContent).
//    			replaceAll("\n"," ").
//    			replaceAll("[\\pP]", " ").
//    			replaceAll("\\p{IsZs}+", " ").toLowerCase.
//    			split(" ")
//    val vm = new HMap[String,Int]
//    for (v <- vs){
//      val c = vm.getOrElse(v, 0)
//      vm(v) = c+1
//    }
//    val s = vm.map(v => {
//      val ss =
//        if (v._1.size == 1){
//          1.1
//        }
//        else if (M.contains(v._1)){
//          v._2*log(N/M(v._1))
//        }
//        else {
//          v._2*log(N/MIN_CC)
//        }
//      (v._1,ss)
//    })
//    s.toMap
//  }
//  
//  def getTokenCount(cutTitle:String,cutContent:String) = {
//    val vs = (cutTitle+" "+cutContent).
//    			replaceAll("\n"," ").
//    			replaceAll("[\\pP]", " ").
//    			replaceAll("\\p{IsZs}+", " ").toLowerCase.
//    			split(" ")
//    val m = HMap[String,Int]()
//    for (v <- vs){
//      val c = m.getOrElse(v,0)
//      m(v) = c+1
//    }
//    
//    m.toMap
//  }
//  
//  // Bm25
//  def getTokenBm25Score(cutTitle:String, cutContent:String) = {
//    val m = getTokenCount(cutTitle,cutContent)
//    val count = (m.values++Array(0)).reduce(_+_) // 会有内容为空的Doc
//    m.map(vc => {
//      val v = vc._1
//      val c = vc._2
//      val n = M.getOrElse(v,MIN_CC)
//      
//      val w1 = log((N-n+0.5)/(n+0.5))
//      val w2 = c*(K1+1)/(c+K1*(1-B+B*count/AVGDL))
//      
//      (v,w1*w2)
//    })    
//  }
//  
////  def getTFIWFScore(cutTitle:String,cutContent:String) = {
////    val m = getTokenCount(cutTitle,cutContent)
////    val N = 5608060688.0
////    val mm = m.map(vc => {
////      val v = vc._1
////      val c = vc._2
////      val n = M.getOrElse(v,1)
////      val w = c*log((N+1)/(n+0.5))
////      (v,w)
////    })   
////    mm
////  }
//  
//  def getTitleKeyword(vs:Array[String],m:Map[String,Int]) = { // TF
//    val vvs = vs.toSet.filter(v => v.size > 1)			
//    vvs
//  }
//  
//  def giveTitleKeywordScore(mm:Map[String,Double],s:Double,vs:Set[String]) = {
//     mm.map(p => {
//      val v = p._1
//      val w =
//        if (vs.contains(v))
//          p._2+(s-p._2)*0.6
//        else
//          p._2
//      (v,w)
//    })
//  }
//  
//  val MAX_VALUE = 100.0
//  
//  def boostKeywordScore(mm:Map[String,Double],vs:Set[String]) = {
//    val B = 3
//    mm.map(p => {
//      val v = p._1
//      val w = 
//        if (vs.contains(v)) min(p._2*B,MAX_VALUE)
//        else p._2
//      (v,w)
//    })
//  }
//  
//  def getMeasureTitleKeyword(vs:Array[String]) = {
//    val XN = 300000
//    val vm = new HMap[String,Int]
//    for (v <- vs){
//      val c = vm.getOrElse(v,0)
//      vm(v) = c+1
//    }
//    val s = vm.map(v => {
//      val ss =
//        if (v._1.size == 1){
//          1.1
//        }
//        else if (T.contains(v._1)){
//          v._2*log(XN/T(v._1))
//        }
//        else {
//          v._2*log(XN/100)
//        }
//      (v._1,ss)
//    })
//    val vvs = s.toMap.filter(_._2 > 5.0).keySet    
//    _log.info((vs++Array("")).reduce(_+" "+_))
//    _log.info((vvs++Set("")).reduce(_+" "+_))    
//    vvs
//  }
//  
//  def score3(cutTitle:String, cutContent:String) = { // Bm25+标题加权
//    val m = getTokenCount(cutTitle,cutContent)
//    val count = (m.values++Array(0)).reduce(_+_)
//    val vvs = cutTitle.replaceAll("\n"," ").
//    			replaceAll("[\\pP]", " ").
//    			replaceAll("\\p{IsZs}+", " ").toLowerCase.
//    			split(" ")
//    val vs = getTitleKeyword(vvs,m)
//    
//    val mm = m.map(vc => {
//      val v = vc._1
//      val c = vc._2
//      val n = M.getOrElse(v, MIN_CC)
//      
//      val w1 = log((N-n+0.5)/(n+0.5))
//      val w2 = c*(K1+1)/(c+K1*(1-B+B*count/AVGDL))
//      
//      (v,w1*w2)
//    })
//    
//    
//    // 标题加权
//    val s = mm.values.max
//    giveTitleKeywordScore(mm,s,vs)
//  }
//  
//  def score5(cutTitle:String, cutContent:String) = { // Bm25+词表标题加权
//    val m = getTokenCount(cutTitle,cutContent)
//    val count = (m.values++Array(0)).reduce(_+_)
//    val vvs = cutTitle.replaceAll("\n"," ").
//    			replaceAll("[\\pP]", " ").
//    			replaceAll("\\p{IsZs}+", " ").toLowerCase.
//    			split(" ")
//    val vs = getMeasureTitleKeyword(vvs)
//    
//    val mm = m.map(vc => {
//      val v = vc._1
//      val c = vc._2
//      val n = M.getOrElse(v, MIN_CC)
//      
//      val w1 = log((N-n+0.5)/(n+0.5))
//      val w2 = c*(K1+1)/(c+K1*(1-B+B*count/AVGDL))
//      
//      (v,w1*w2)
//    })
//    
//    
//    // 标题加权
//    val s = mm.values.max
//    giveTitleKeywordScore(mm,s,vs)
//  }  
//  
//  def score4(cutTitle:String,cutContent:String) = { // TFIDF+标题加权
//    val m = getTokenCount(cutTitle,cutContent)
//    val vvs = cutTitle.replaceAll("\n"," ").
//    			replaceAll("[\\pP]", " ").
//    			replaceAll("\\p{IsZs}+", " ").toLowerCase.
//    			split(" ")
//    val vs = getTitleKeyword(vvs,m)
//    
//    val mm = m.map(vc => {
//      val v = vc._1
//      val c = vc._2
//      val n = M.getOrElse(v,MIN_CC)
//      val w = c*log(N/n)
//      (v,w)
//    })
//    
//    // 标题加权
//    val s = mm.values.max
//    giveTitleKeywordScore(mm,s,vs)
//  }
//  
//  def score6(cutTitle:String,cutContent:String) = { // TFIDF+词表标题加权
//    val m = getTokenCount(cutTitle,cutContent)
//    val vvs = cutTitle.replaceAll("\n"," ").
//    			replaceAll("[\\pP]", " ").
//    			replaceAll("\\p{IsZs}+", " ").toLowerCase.
//    			split(" ")
//    val vs = vvs.toSet.filter(_.size > 1)
//    
//    val mm = m.map(vc => {
//      val v = vc._1
//      val c = vc._2
//      val n = M.getOrElse(v,MIN_CC)
//      val w = c*log((N+1)/(n+0.5))
//      (v,w)
//    })
//    
//    // 标题加权
//    //val s = mm.values.max
//    //giveTitleKeywordScore(mm,s,vs)
//    boostKeywordScore(mm,vs)
//    mm
//  }
//  
//  def score7(cutTitle:String,cutContent:String) = { // LogTFIDF
//    val m = getTokenCount(cutTitle,cutContent)
//    
//    val mm = m.map(vc => {
//      val v = vc._1
//      val c = vc._2
//      val n = M.getOrElse(v,MIN_CC)
//      val w = log(c+1)*log(N/n)
//      (v,w)
//    })
//    
//    mm
//  }
//  
//  def score8(cutTitle:String,cutContent:String) = { // LogTFIDF + 标题
//    val m = getTokenCount(cutTitle,cutContent)
//    val vvs = cutTitle.replaceAll("\n"," ").
//    			replaceAll("[\\pP]", " ").
//    			replaceAll("\\p{IsZs}+", " ").toLowerCase.
//    			split(" ")
//    val vs = getTitleKeyword(vvs,m)
//    
//    val mm = m.map(vc => {
//      val v = vc._1
//      val c = vc._2
//      val n = M.getOrElse(v,MIN_CC)
//      val w = log(c+1)*log(N/n)
//      (v,w)
//    })
//    
//    val s = mm.values.max
//    giveTitleKeywordScore(mm,s,vs)
//  }
//  
//  def score9(cutTitle:String,cutContent:String) = {
//    val vvs = cutTitle.replaceAll("\n"," ").
//    			replaceAll("[\\pP]", " ").
//    			replaceAll("\\p{IsZs}+", " ").toLowerCase.
//    			split(" ")
//    getTitleScore(vvs)
//  }
//  
//  def score1(cutTitle:String, cutContent:String) = {
//    val m = getTokenBm25Score(cutTitle,cutContent)
//    m
//  }
//  
//  def score2(cutTitle:String,cutContent:String) = {
//    val m = getTFIDFScore(cutTitle,cutContent)
//    m
//  }
//  
//  def score(cutTitle:String, cutContent:String) = {
//    val m = getTFIDFScore(cutTitle,cutContent)
//    m
//  }
//  
//}